/////////////////////////////////////////////////////////////////////////////////
//
//                     NERTCEngine 的异常（严重）
//
/////////////////////////////////////////////////////////////////////////////////

/** SDK错误码定义(https://doc.yunxin.163.com/nertc/docs/jUxMjc0OTY?platform=android) */
export enum NERTCEngineErrorCode {
  /** 执行成功。 */
  "OK" = 0,
  /** 通用参数错误。 */
  "ENGINE_ERROR_PARAMS" = 1,
  /** 权限不足。 */
  "ENGINE_ERROR_ROOM_SERVER_PERMISSION_DENIED" = 403,
  /** 请求超时。 */
  "ENGINE_ERROR_ROOM_SERVER_REQUEST_TIMEOUT" = 408,
  /**服务器请求参数错误。 */
  "ENGINE_ERROR_ROOM_SERVER_INVALID_PARAMETERS" = 414,
  /** 非法的AppKey。 */
  "ENGINE_ERROR_ROOM_SERVER_INVALID_APPKEY" = 417,
  /** 分配房间时出现服务器未知错误。 */
  "ENGINE_ERROR_ROOM_SERVER_UNKNOWN_ERROR" = 500,
  /** 登录房间的用户数超过限制的两人。 */
  "ENGINE_ERROR_ROOM_SERVER_ONLY_SUPPORT_TWO_USERS" = 600,
  /** 登录房间时权限密钥错误。 */
  "ENGINE_ERROR_ROOM_SERVER_PERMISSION_KEY_ERROR" = 901,
  /** 登录房间时权限密钥过期。 */
  "ENGINE_ERROR_ROOM_SERVER_PERMISSION_KEY_TIMEOU" = 902,
  /** ask请求无效，因为该请求被后续操作覆盖了。 */
  "ENGINE_ERROR_LIVESTREAM_INVAILD_REQUEST" = 1301,
  /** 推流的参数格式错误。 */
  "ENGINE_ERROR_LIVESTREAM_INVAILD_PARAMETERS" = 1400,
  /** 房间已经退出。 */
  "ENGINE_ERROR_LIVESTREAM_ROOM_HAS_EXITED" = 1401,
  /** 推流任务超出上限。 */
  "ENGINE_ERROR_LIVESTREAM_EXCEED_LIMIT" = 1402,
  /** 推流 ID 重复。 */
  "ENGINE_ERROR_LIVESTREAM_DUPLICATE_ID" = 1403,
  /** taskId任务不存在，或房间不存在。。 */
  "ENGINE_ERROR_LIVESTREAM_NOT_FOUND" = 1404,
  /** 请求失败。 */
  "ENGINE_ERROR_LIVESTREAM_REQUEST_FAILED" = 1417,
  /** 服务器内部错误。 */
  "ENGINE_ERROR_LIVESTREAM_INTERNAL_SERVER_ERROR" = 1500,
  /** 布局参数错误。 */
  "ENGINE_ERROR_LIVESTREAM_INVALID_LAYOUT" = 1501,
  /**布局的图片错误。 */
  "ENGINE_ERROR_LIVESTREAM_USER_PICTURE_ERROR" = 1512,
  /** 用户无发流权限。 */
  "ENGINE_ERROR_PERMISSION_KEY_NO_PUBLISH_PERMISSION" = 1620,
  /** 用户无订阅权限。 */
  "ENGINE_ERROR_PERMISSION_KEY_ENGINE_ERROR_PERMISSION_KEY_NO_SUBSCRIBE_PERMISSION" = 2803,
  /** 加入房间的人数达到限制。 */
  "kLiteSDKServerPersonsInRoomReachedTheLimit" = 4003,
  /** 内部错误。 */
  "ENGINE_ERROR_FATAL" = 30001,
  /** 内存溢出。 */
  "ENGINE_ERROR_OUT_OF_MEMORY" = 30002,
  /** 参数错误。 */
  "ENGINE_ERROR_INVALID_PARAM" = 30003,
  /** 不支持的操作。 */
  "ENGINE_ERROR_NOT_SUPPORTED" = 30004,
  /** 状态错误。 */
  "ENGINE_ERROR_INVALID_STATE" = 30005,
  /** 缺乏资源。 */
  "ENGINE_ERROR_LACK_OF_RESOURCE" = 30006,
  /** index序号非法。 */
  "ENGINE_ERROR_INVALID_INDEX" = 30007,
  /**设备未找到。 */
  "ENGINE_ERROR_DEVICE_NOT_FOUND" = 30008,
  /** 设备 ID 不存在。 */
  "ENGINE_ERROR_INVALID_DEVICE_SOURCEID" = 30009,
  /** 视频能力profile type不符合要求。 */
  "ENGINE_ERROR_INVALID_VIDEO_PROFILE" = 30010,
  /** 创建设备失败。 */
  "ENGINE_ERROR_CREATE_DEVICE_SOURCE_FAIL" = 30011,
  /** 画布非法。 */
  "ENGINE_ERROR_INVALID_RENDER" = 30012,
  /** 本地视频预览已打开。 */
  "ENGINE_ERROR_DEVICE_PREVIEW_ALREADY_STARTED" = 30013,
  /** 高级 Token 鉴权失败，用户权限验证错误。 */
  "ENGINE_ERROR_USER_PERMISSION_KEY_AUTH_FAILED" = 30121,
  /** SEI 超过最大数据限制。 */
  "ENGINE_ERROR_SEI_EXCEED_MAX_DATA_LIMIT" = 30122,
  /** 数据通道发送大小超过限制。 */
  "ENGINE_ERROR_DATA_CHANNEL_EXCEED_MAX_DATA_LIMIT" = 30123,
  /** 连接未找到。 */
  "ENGINE_ERROR_CONNECTION_NOT_FOUND" = 30200,
  /** 媒体流不存在。 */
  "ENGINE_ERROR_STREAM_NOT_FOUND" = 30201,
  /** 添加媒体播放器音轨失败。 */
  "ENGINE_ERROR_ADD_TRACK_FAIL" = 30202,
  /** 媒体播放器音轨未找到。 */
  "ENGINE_ERROR_TRACK_NOT_FOUND" = 30203,
  /** 媒体连接已断开。 */
  "ENGINE_ERROR_MEDIA_CONNECTION_DISCONNECTED" = 30204,
  /** 信令断开。 */
  "ENGINE_ERROR_SIGNAL_DISCONNECTED" = 30205,
  /** 用户被管理员移出房间。 */
  "ENGINE_ERROR_SERVER_KICKED" = 30206,
  /** 房间已关闭。 */
  "ENGINE_ERROR_ROOM_CLOSED" = 30207,
  /** 因为切换房间而离开房间。 */
  "LEAVE_CHANNEL_FOR_SWITCH" = 30208,
  /** 因为重复 UID 登录而离开房间。 */
  "LEAVE_CHANNEL_FOR_DUPLICATE_UID" = 30209,
  /** 没有音频设备的权限。 */
  "ENGINE_ERROR_ADM_No_Authorize" = 40000,
  /** 初始化音频采集设备（麦克风）失败。 */
  "ENGINE_ERROR_ADM_INIT_RECORDING_FAILED" = 40001,
  /** 启动音频采集设备（麦克风）失败。 */
  "ENGINE_ERROR_ADM_START_RECORDING_FAILED" = 40002,
  /** 停止音频采集设备（麦克风）失败。 */
  "ENGINE_ERROR_ADM_STOP_RECORDING_FAILED" = 40003,
  /** 初始化音频播放设备失败。。 */
  "ENGINE_ERROR_ADM_INIT_PLAYOUT_FAILED" = 40004,
  /** 音频播放设备启动失败。 */
  "ENGINE_ERROR_ADM_START_PLAYOUT_FAILED" = 40005,
  /** 音频播放设备停止失败。 */
  "ENGINE_ERROR_ADM_STOP_PLAYOUT_FAILED" = 40006,
  /** 音频采集设备运行异常。 */
  "ENGINE_ERROR_ADM_RECORDING_FAILED" = 40007,
  /** 音频播放设备运行异常。 */
  "ENGINE_ERROR_ADM_PLAYOUT_FAILED" = 40008,
  /** 没有视频设备权限。 */
  "ENGINE_ERROR_VDM_NO_AUTHORIZE" = 50000,
  /** 非屏幕共享使用辅流。 */
  "ENGINE_ERROR_VDM_NOT_SCREEN_USE_SUB_STREAM" = 50001,
  /** 摄像头断开。 */
  "ENGINE_ERROR_VDM_CAMERA_DISCONNECT" = 50303,
  /** 摄像头死机。 */
  "ENGINE_ERROR_VDM_CAMERA_FREEZED" = 50304,
  /** 未知摄像头错误。 */
  "ENGINE_ERROR_VDM_CAMERA_UNKNOWN_ERROR" = 50305,
  /** 摄像头无数据帧。 */
  "ENGINE_ERROR_VDM_CAMERA_NO_FRAME" = 50306,
  /** 摄像头启动失败。 */
  "ENGINE_ERROR_VDM_CAMERA_CREATE_FAIL" = 50307,
  /** 没有录制视频权限。 */
  "ENGINE_ERROR_VDM_SCREEN_CAPTURE_NO_AUTHORIZE" = 50400,
}

/////////////////////////////////////////////////////////////////////////////////
//
//                     JS 封装层抛出的异常（严重）
//
/////////////////////////////////////////////////////////////////////////////////
/**
 * @namespace ErrorCode
 * @description 错误码
 */
export const NERTCJSError = {
  /**
   * 未知错误
   * @default 0xFFFF
   * @memberof module:ErrorCode
   */
  UNKNOWN: 0xffff,
  /**
   * 无效参数
   *
   * @default 0x1000
   * @memberof module:ErrorCode
   */
  INVALID_PARAMETER: 0x1000,
  /**
   * 非法操作
   *
   * @default 0x1001
   * @memberof module:ErrorCode
   */
  INVALID_OPERATION: 0x1001,
};
const getErrorName = function (code: number) {
  //@ts-ignore
  let _TXLiteJSError = TXLiteJSError;
  for (let key in _TXLiteJSError) {
    if (_TXLiteJSError[key] === code) {
      return key;
    }
  }
  return "UNKNOWN";
};
/**
 * NERTCJSError 错误对象<br>
 * @extends Error
 * @namespace ErrorCode
 */
class NERTCJSErr extends Error {
  errCode: number;
  errMsg: string;
  extraInfo: any;
  constructor({ code = NERTCJSError.UNKNOWN, message, extraInfo }: AnyObject) {
    //@ts-ignore
    let _errorCodeUrl = errorCodeUrl;
    if (extraInfo) {
      const tempError = {
        errCode: code,
        errMsg: message,
        extraInfo: Object.assign(Object.assign({}, extraInfo), {
          errCodeUrl: _errorCodeUrl,
        }),
      };
      super(JSON.stringify(tempError));
    } else {
      super(
        message +
          ` <${getErrorName(code)} 0x${code.toString(
            16
          )}>. Refer to: ${_errorCodeUrl}`
      );
    }
    this.errCode = code;
    this.errMsg = message;
    this.extraInfo = Object.assign(Object.assign({}, extraInfo), {
      errCodeUrl: _errorCodeUrl,
    });
  }
  /**
   * 获取错误码<br>
   * 详细错误码列表参见 {@link module:ErrorCode ErrorCode}
   * @memberof NERTCJSError
   */
  getCode() {
    return this.errCode;
  }
  getMessage() {
    return this.errMsg;
  }
}
export default NERTCJSErr;
